/**
 *
 */
package com.jintian.smart.kernel.common.expr.op.define;

import com.alibaba.fastjson.util.TypeUtils;
import com.jintian.smart.kernel.common.expr.datameta.BaseDataMeta;
import com.jintian.smart.kernel.common.expr.datameta.Constant;
import com.jintian.smart.kernel.common.expr.op.Operator;
import com.jintian.smart.kernel.core.expr.IllegalExpressionException;

import java.math.BigDecimal;

/**
 * 算术取模操作
 *
 */
public class Op_MOD extends Op_Base {
    public Op_MOD() {
        super(Operator.MOD);
    }

    public Constant execute(Constant[] args) throws IllegalExpressionException {
        Object[] params = this.getParameterValues(args);
        Constant ret = this.numberVerifyResult(-1, args);
        BigDecimal value = TypeUtils.castToBigDecimal(params[0]).remainder(TypeUtils.castToBigDecimal(params[1]));
        if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_BIGDECIMAL)) {
            ret.setDataValue(value);
        } else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_DOUBLE)) {
            ret.setDataValue(value.doubleValue());
        } else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_FLOAT)) {
            ret.setDataValue(value.floatValue());
        } else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_LONG)) {
            ret.setDataValue(value.longValue());
        } else if (ret.getDataType().equals(BaseDataMeta.DataType.DATATYPE_INT)) {
            ret.setDataValue(value.intValue());
        }
        return ret;
    }

    public Constant verify(int opPositin, BaseDataMeta[] args) throws IllegalExpressionException {
        this.checkParameterCount(opPositin, args);
        return this.numberVerifyResult(opPositin, args);
    }
}
